<?php

class VkUser
{
    protected $_id;
    protected $_name;
    protected $_surname;
    protected $_photoSmall;
    protected $_photoMedium;
    protected $_sex;
    protected $_userRow;
    
    
    public function __construct($id = null)
    {
    	debug_print_backtrace();
    	die();
        if (!$id && isset($_SESSION['vk_id'])) {
            $id = $_SESSION['vk_id'];
        }
        
        if (!$id) {
            $id = $this->_getUserByAvailableInformation();
        }
        
        if (!$id) {
            throw new Zend_Service_Exception('Не удалось создать пользователя, нет кода');
        }
        
        $user = vk::getInstance()->api('users.get', array(
            'uids' => $id,
            'fields' => 'first_name,last_name,sex,photo,photo_medium'
        ));
        
        $this->_id = $user[0]['uid'];
        
        $this->_name = $user[0]['first_name'];
        
        $this->_surname = $user[0]['last_name'];
    }
    
    public function getId()
    {
        return $this->_id;
    }
    
    public function getName()
    {
        return $this->_name;
    }
    
    public function getSurname()
    {
        return $this->_surname;
    }
    
    public function getPhotoSmall()
    {
        return $this->_photoSmall;
    }
    
    public function getPhotoMedium()
    {
        return $this->_photoMedium;
    }
    
    public function getSex()
    {
        return $this->_sex;
    }
    
    /**
     * 
     * @return UserRow
     */
    public function getRow()
    {
        if($this->_userRow){
            return $this->_userRow;
        }
        
        $select = UserPeer::getInstance()->select();
        $select->where('vk_id = ?', $this->_id);
        $row = UserPeer::getInstance()->fetchRow($select);
        
        if (!$row) {
            $row = UserPeer::getInstance()->createNewUser($this);
        }
        
        $this->_userRow = $row;
        
        return $this->_userRow;
    }
    
    /**
     * @return boolean 
     */
    public function hasAccessToken()
    {
        if ($this->getAccessToken()) {
            return true;
        }
        
        return false;
    }
    
    /**
     * @return string
     */
    public function getAccessToken()
    {
        return $this->getRow()->getAccessToken();
    }
    
    /**
    * Получает токен текущего пользователя, используя параметр $_GET['code'] или $_SESSION['code']
    * 
    * @return integer
    * @throws Zend_Auth_Exception
    */
    protected function _getUserByAvailableInformation()
    {
  
        if (!isset($_GET['code'])) {
            return null; 
        }
        $code = $_GET['code'];

        $appId = Config::getInstance()->vk->app_id;
        $secret = Config::getInstance()->vk->app_secret;
        
        $query = "https://api.vk.com/oauth/access_token?client_id=$appId&client_secret=$secret&code=$code";
        $uri = Zend_Uri::factory($query);
        $client = new Zend_Http_Client($uri);
        $result = $client->request();
        $response = json_decode($result->getBody(), true);
        if (isset($response['error'])) {
            $error_description = mb_convert_encoding( $response['error_description'], 'utf-8', 'windows-1251' );
            throw new Zend_Auth_Exception($error_description);
        }

       $_SESSION['auth_access_token'] = $response['access_token'];
        $_SESSION['vk_id'] = $response['user_id'];
        return $response['user_id'];

    }
    
    /**
     * @return GroupsRow
     * @throws Zend_Auth_Exception 
     */
    
    public function getGroups()
    {
        $groups = $this->getRow()->getGroupsRowsetByUser2group();
        
        if (!$groups->count()) {
            // если групп нет в базе, то извлекаем группы из ВК
            $groups = vk::getInstance()->api('groups.get', array(
                'uid'	   => $this->getId(),
                'extended' => 1,
                'filter'   => 'admin',
                'access_token' => $this->getAccessToken()
            ));
            if (empty($groups)) {
                throw new Zend_Auth_Exception('Группы не найдены');
            }
            unset($groups[0]);
            // сохраняем группы в бд
            foreach($groups as $group) {
                // сохраняем группу в базе
                $groupRow = GroupsPeer::getInstance()->createNewGroup($group);
  				if (!$groupRow) {
  					continue;
  				}
  				
                // получаем ID созданной группы
                $group_id = $groupRow->getId();
                	
                $select = User2groupPeer::getInstance()->select();
                $select->where('user_id = ?', $this->getRow()->getId())
                       ->where('group_id = ?', $group_id);
                $row = User2groupPeer::getInstance()->fetchRow($select);
                if (!$row) {
                    $row = User2groupPeer::getInstance()->createRow();
                    $row->setUserId($this->getRow()->getId());
                    $row->setGroupId($group_id);
                    $row->save();
                
                }
                
                // создаем дирректорию для группы
                $dir = $_SERVER['DOCUMENT_ROOT'] . '/images/groups/' . $group['gid'];
                if(!is_dir($dir)){
                    if(!mkdir($dir)){
                        throw new Exception('Ошибка при создании каталога для группы '.$group['name']);
                    }
                }
                
                // создаем очередь
                $rowTurn = TurnPeer::getInstance()->createRow();
                $rowTurn->name = 'Основная очередь';
                $rowTurn->group_id = $groupRow->getId();
                $rowTurn->created_at = date('Y-m-d', time());
                $rowTurn->save();
            }
            
            // получаем группы еще раз
            $groups = $this->getRow()->getGroupsRowsetByUser2group();
        }
        if(!$groups->count()){
            throw new Zend_Auth_Exception('Группы не найдены');
        }
        return $groups;
    }
	
}
